會利用兩天的時間來製作這個記帳小專題,今天是第一部分!希望可以順利執行~
#include <iostream>
#include <fstream>
#include <string>
#include <ctime>
#include <cstdlib>
#include <sstream>
#define MaxNum 256
using namespace std;
// 寫入資料到檔案
void writeToFile(int year, int month, int type, int amount) {
ofstream myfile;
myfile.open("data.txt", ios::out | ios::app); // 以附加方式寫入檔案
if (!myfile.is_open()) {
cout << "檔案開啟失敗" << endl;
return;
}
// 將資料寫入檔案,以 < 作為分隔符
myfile << year << "<" << month << "<" << type << "<" << amount << endl;
myfile.close();
}
// 讀取檔案並根據年份與月份顯示資料
void readFile(int year, int month) {
int readYear, readMonth, readType, readAmount;
int record[8] = {0}; // 初始化記錄
ifstream myfile("data.txt");
if (!myfile.is_open()) {
cout << "檔案開啟失敗" << endl;
return;
}
string line;
// 讀取每一行並解析
while (getline(myfile, line)) {
stringstream ss(line);
char delimiter;
ss >> readYear >> delimiter >> readMonth >> delimiter >> readType >> delimiter >> readAmount;
if ((readYear == year && readMonth == month) || month == 0) {
record[0] += readAmount; // 總金額
record[readType] += readAmount; // 類型對應的金額
}
}
// 顯示結果
cout << "年份:" << year << " 月份:" << month << endl;
if (record[0] == 0) {
cout << "無此月份資料" << endl;
} else {
cout << "種類\t 金額\t 比例" << endl;
cout << "=============================" << endl;
cout << "總額\t" << record[0] << endl;
cout << "食\t" << record[1] << "\t" << record[1] * 100 / record[0] << "%" << endl;
cout << "衣\t" << record[2] << "\t" << record[2] * 100 / record[0] << "%" << endl;
cout << "住\t" << record[3] << "\t" << record[3] * 100 / record[0] << "%" << endl;
cout << "行\t" << record[4] << "\t" << record[4] * 100 / record[0] << "%" << endl;
cout << "育\t" << record[5] << "\t" << record[5] * 100 / record[0] << "%" << endl;
cout << "樂\t" << record[6] << "\t" << record[6] * 100 / record[0] << "%" << endl;
cout << "其他\t" << record[7] << "\t" << record[7] * 100 / record[0] << "%" << endl;
}
myfile.close();
}
int main() {
int temp;
struct tm *local;
time_t t;
char* dt;
// 假設這裡有些邏輯來取得當前時間或處理使用者輸入
time(&t);
local = localtime(&t);
dt = ctime(&t);
// 範例使用者操作
int year = local->tm_year + 1900;
int month = local->tm_mon + 1;
writeToFile(year, month, 1, 500); // 寫入測試資料
readFile(year, month); // 讀取並顯示資料
return 0;
}
說明:記帳系統的基礎功能,裡面包含資料寫入與讀取。writeToFile()
函數接收年份、月份、類型及金額,並將這些資訊以附加方式寫入到 data.txt
檔案中,確保舊資料不會被覆蓋。readFile()
函數則會讀取該檔案,根據指定的年份與月份匯總各類型的金額,並計算各類別佔總額的比例。程式使用了 fstream
處理檔案讀寫,stringstream
解析檔案內容中的分隔符號 <
,並以表格式顯示資料。主函數中使用系統時間作為範例輸入進行測試。以上是這一部分程式碼的解說!
!!以上內容是跟著第一次學C++就上手第二版一起跟著實作練習!!
今天也不知不覺來到了第28天,明天會繼續把這個小專案做完!希望一切順利囉,加油